home *** CD-ROM | disk | FTP | other *** search
/ Micromanía 92 / CDMM92_1.ISO / SOF 2 SDK / sof2sdk-101.msi / _92D6AC311BB48EBA344BBABC89DA6AB0 / _D40EE9EBB51D48EDA4ECA4E8FA0A6FC0 < prev    next >
Encoding:
Text File  |  2002-06-06  |  9.9 KB  |  376 lines

  1. // Copyright (C) 2001-2002 Raven Software.
  2. //
  3.  
  4. #include "gt_local.h"
  5.  
  6. #define    ITEM_REDFLAG            100
  7. #define ITEM_BLUEFLAG            101
  8.                                 
  9. #define TRIGGER_REDCAPTURE        200
  10. #define TRIGGER_BLUECAPTURE        201
  11.  
  12. void    GT_Init        ( void );
  13. void    GT_RunFrame    ( int time );
  14. int        GT_Event    ( int cmd, int time, int arg0, int arg1, int arg2, int arg3, int arg4 );
  15.  
  16. gametypeLocals_t    gametype;
  17.  
  18. typedef struct 
  19. {
  20.     vmCvar_t    *vmCvar;
  21.     char        *cvarName;
  22.     char        *defaultString;
  23.     int            cvarFlags;
  24.     float        mMinValue, mMaxValue;
  25.     int            modificationCount;  // for tracking changes
  26.     qboolean    trackChange;        // track this variable, and announce if changed
  27.     qboolean    teamShader;            // track and if changed, update shader state
  28.  
  29. } cvarTable_t;
  30.  
  31. vmCvar_t    gt_flagReturnTime;
  32. vmCvar_t    gt_simpleScoring;
  33.  
  34. static cvarTable_t gametypeCvarTable[] = 
  35. {
  36.     // don't override the cheat state set by the system
  37.     { >_flagReturnTime,    "gt_flagReturnTime",    "30", CVAR_ARCHIVE, 0.0f, 0.0f, 0, qfalse },
  38.     { >_simpleScoring,    "gt_simpleScoring",        "0",  CVAR_ARCHIVE, 0.0f, 0.0f, 0, qfalse },
  39. };
  40.  
  41. static int gametypeCvarTableSize = sizeof( gametypeCvarTable ) / sizeof( gametypeCvarTable[0] );
  42.  
  43. /*
  44. ================
  45. vmMain
  46.  
  47. This is the only way control passes into the module.
  48. This must be the very first function compiled into the .q3vm file
  49. ================
  50. */
  51. int vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8, int arg9, int arg10, int arg11 ) 
  52. {
  53.     switch ( command ) 
  54.     {
  55.         case GAMETYPE_INIT:
  56.             GT_Init ( );
  57.             return 0;
  58.  
  59.         case GAMETYPE_START:
  60.             trap_Cmd_SetHUDIcon ( 0, gametype.iconRedFlag );
  61.             trap_Cmd_SetHUDIcon ( 1, gametype.iconBlueFlag );
  62.             return 0;
  63.  
  64.         case GAMETYPE_RUN_FRAME:
  65.             GT_RunFrame ( arg0 );
  66.             return 0;
  67.  
  68.         case GAMETYPE_EVENT:
  69.             return GT_Event ( arg0, arg1, arg2, arg3, arg4, arg5, arg6 );
  70.     }
  71.  
  72.     return -1;
  73. }
  74.  
  75. /*
  76. =================
  77. GT_RegisterCvars
  78. =================
  79. */
  80. void GT_RegisterCvars( void ) 
  81. {
  82.     int            i;
  83.     cvarTable_t    *cv;
  84.  
  85.     for ( i = 0, cv = gametypeCvarTable ; i < gametypeCvarTableSize ; i++, cv++ ) 
  86.     {
  87.         trap_Cvar_Register( cv->vmCvar, cv->cvarName, cv->defaultString, cv->cvarFlags, cv->mMinValue, cv->mMaxValue );
  88.         
  89.         if ( cv->vmCvar )
  90.         {
  91.             cv->modificationCount = cv->vmCvar->modificationCount;
  92.         }
  93.     }
  94. }
  95.  
  96. /*
  97. =================
  98. GT_UpdateCvars
  99. =================
  100. */
  101. void GT_UpdateCvars( void ) 
  102. {
  103.     int            i;
  104.     cvarTable_t    *cv;
  105.  
  106.     for ( i = 0, cv = gametypeCvarTable ; i < gametypeCvarTableSize ; i++, cv++ ) 
  107.     {
  108.         if ( cv->vmCvar ) 
  109.         {
  110.             trap_Cvar_Update( cv->vmCvar );
  111.  
  112.             if ( cv->modificationCount != cv->vmCvar->modificationCount ) 
  113.             {
  114.                 cv->modificationCount = cv->vmCvar->modificationCount;
  115.             }
  116.         }
  117.     }
  118. }
  119.  
  120. /*
  121. ================
  122. GT_Init
  123.  
  124. initializes the gametype by spawning the gametype items and 
  125. preparing them
  126. ================
  127. */
  128. void GT_Init ( void )
  129. {
  130.     gtItemDef_t        itemDef;
  131.     gtTriggerDef_t    triggerDef;
  132.  
  133.     memset ( &gametype, 0, sizeof(gametype) );
  134.  
  135.     // Register the global sounds
  136.     gametype.flagReturnSound  = trap_Cmd_RegisterSound ( "sound/ctf_return.mp3" );
  137.     gametype.flagTakenSound   = trap_Cmd_RegisterSound ( "sound/ctf_flag.mp3" );
  138.     gametype.flagCaptureSound = trap_Cmd_RegisterSound ( "sound/ctf_win.mp3" );
  139.  
  140.     gametype.iconRedFlag = trap_Cmd_RegisterIcon ( "gfx/menus/hud/ctf_red" );
  141.     gametype.iconBlueFlag = trap_Cmd_RegisterIcon ( "gfx/menus/hud/ctf_blue" );
  142.  
  143.     gametype.iconRedFlagDropped = trap_Cmd_RegisterIcon ( "gfx/menus/hud/ctf_red_dropped" );
  144.     gametype.iconBlueFlagDropped = trap_Cmd_RegisterIcon ( "gfx/menus/hud/ctf_blue_dropped" );
  145.  
  146.     gametype.iconRedFlagCarried = trap_Cmd_RegisterIcon ( "gfx/menus/hud/ctf_red_carried" );
  147.     gametype.iconBlueFlagCarried = trap_Cmd_RegisterIcon ( "gfx/menus/hud/ctf_blue_carried" );
  148.  
  149.     // Register all cvars for this gametype
  150.     GT_RegisterCvars ( );
  151.  
  152.     // Register the items
  153.     memset ( &itemDef, 0, sizeof(itemDef) );
  154.     trap_Cmd_RegisterItem ( ITEM_REDFLAG,  "red_flag", &itemDef );
  155.     trap_Cmd_RegisterItem ( ITEM_BLUEFLAG, "blue_flag", &itemDef );
  156.  
  157.     // Register the triggers
  158.     memset ( &triggerDef, 0, sizeof(triggerDef) );
  159.     trap_Cmd_RegisterTrigger ( TRIGGER_REDCAPTURE, "red_capture_point", &triggerDef );
  160.     trap_Cmd_RegisterTrigger ( TRIGGER_BLUECAPTURE, "blue_capture_point", &triggerDef );
  161. }
  162.  
  163. /*
  164. ================
  165. GT_RunFrame
  166.  
  167. Runs all thinking code for gametype
  168. ================
  169. */
  170. void GT_RunFrame ( int time )
  171. {
  172.     gametype.time = time;
  173.  
  174.     // See if we need to return the red flag yet
  175.     if ( gametype.redFlagDropTime && time - gametype.redFlagDropTime > gt_flagReturnTime.integer * 1000 )
  176.     {
  177.         trap_Cmd_ResetItem ( ITEM_REDFLAG );
  178.         trap_Cmd_TextMessage ( -1, "The Red Flag has returned!" );
  179.         trap_Cmd_SetHUDIcon ( 0, gametype.iconRedFlag );
  180.         trap_Cmd_StartGlobalSound ( gametype.flagReturnSound );
  181.         gametype.redFlagDropTime = 0;
  182.     }
  183.  
  184.     // See if we need to return the blue flag yet
  185.     if ( gametype.blueFlagDropTime && time - gametype.blueFlagDropTime > gt_flagReturnTime.integer * 1000 )
  186.     {
  187.         trap_Cmd_ResetItem ( ITEM_BLUEFLAG );
  188.         trap_Cmd_TextMessage ( -1, "The Blue Flag has returned!" );
  189.         trap_Cmd_SetHUDIcon ( 1, gametype.iconBlueFlag );
  190.         trap_Cmd_StartGlobalSound ( gametype.flagReturnSound );
  191.         gametype.blueFlagDropTime = 0;
  192.     }
  193.  
  194.     GT_UpdateCvars ( );
  195. }
  196.  
  197. /*
  198. ================
  199. GT_Event
  200.  
  201. Handles all events sent to the gametype
  202. ================
  203. */
  204. int GT_Event ( int cmd, int time, int arg0, int arg1, int arg2, int arg3, int arg4 )
  205. {
  206.     switch ( cmd )
  207.     {
  208.         case GTEV_ITEM_DEFEND:
  209.             if ( !gt_simpleScoring.integer )
  210.             {
  211.                 trap_Cmd_AddClientScore ( arg1, 5 );
  212.             }
  213.             return 0;
  214.  
  215.         case GTEV_ITEM_STUCK:
  216.             switch ( arg0 )
  217.             {
  218.                 case ITEM_REDFLAG:
  219.                     trap_Cmd_ResetItem ( ITEM_REDFLAG );
  220.                     trap_Cmd_TextMessage ( -1, "The Red Flag has returned!" );
  221.                     trap_Cmd_StartGlobalSound ( gametype.flagReturnSound );
  222.                     gametype.redFlagDropTime = 0;
  223.                     trap_Cmd_SetHUDIcon ( 0, gametype.iconRedFlag );
  224.                     return 1;
  225.  
  226.                 case ITEM_BLUEFLAG:
  227.                     trap_Cmd_ResetItem ( ITEM_BLUEFLAG );
  228.                     trap_Cmd_TextMessage ( -1, "The Blue Flag has returned!" );
  229.                     trap_Cmd_StartGlobalSound ( gametype.flagReturnSound );
  230.                     gametype.blueFlagDropTime = 0;
  231.                     trap_Cmd_SetHUDIcon ( 1, gametype.iconBlueFlag );
  232.                     return 1;
  233.             }
  234.             
  235.             break;
  236.  
  237.         case GTEV_ITEM_DROPPED:
  238.         {
  239.             char clientname[MAX_QPATH];
  240.  
  241.             trap_Cmd_GetClientName ( arg1, clientname, MAX_QPATH );
  242.  
  243.             switch ( arg0 )
  244.             {
  245.                 case ITEM_BLUEFLAG:
  246.                     trap_Cmd_TextMessage ( -1, va("%s has dropped the Blue Flag!", clientname ) );
  247.                     trap_Cmd_SetHUDIcon ( 1, gametype.iconBlueFlagDropped );
  248.                     gametype.blueFlagDropTime = time;
  249.                     break;
  250.                 
  251.                 case ITEM_REDFLAG:
  252.                     trap_Cmd_TextMessage ( -1, va("%s has dropped the Red Flag!", clientname ) );
  253.                     trap_Cmd_SetHUDIcon ( 0, gametype.iconRedFlagDropped );
  254.                     gametype.redFlagDropTime = time;
  255.                     break;
  256.             }
  257.             break;
  258.         }
  259.  
  260.         case GTEV_ITEM_TOUCHED:
  261.  
  262.             switch ( arg0 )
  263.             {
  264.                 case ITEM_BLUEFLAG:
  265.                     if ( arg2 == TEAM_RED )
  266.                     {
  267.                         char clientname[MAX_QPATH];
  268.                         trap_Cmd_GetClientName ( arg1, clientname, MAX_QPATH );
  269.                         trap_Cmd_TextMessage ( -1, va("%s has taken the Blue Flag!", clientname ) );
  270.                         trap_Cmd_StartGlobalSound ( gametype.flagTakenSound );
  271.                         trap_Cmd_RadioMessage ( arg1, "got_it" );
  272.                         trap_Cmd_SetHUDIcon ( 1, gametype.iconBlueFlagCarried );
  273.                         gametype.blueFlagDropTime = 0;
  274.  
  275.                         return 1;
  276.                     }
  277.                     break;
  278.  
  279.                 case ITEM_REDFLAG:
  280.                     if ( arg2 == TEAM_BLUE )
  281.                     {
  282.                         char clientname[MAX_QPATH];
  283.                         trap_Cmd_GetClientName ( arg1, clientname, MAX_QPATH );
  284.                         trap_Cmd_TextMessage ( -1, va("%s has taken the Red Flag!", clientname ) );
  285.                         trap_Cmd_StartGlobalSound ( gametype.flagTakenSound );
  286.                         trap_Cmd_RadioMessage ( arg1, "got_it" );
  287.                         trap_Cmd_SetHUDIcon ( 0, gametype.iconRedFlagCarried );
  288.                         gametype.redFlagDropTime = 0;
  289.  
  290.                         return 1;
  291.                     }
  292.                     break;
  293.             }
  294.  
  295.             return 0;
  296.  
  297.         case GTEV_TRIGGER_TOUCHED:
  298.             switch ( arg0 )
  299.             {
  300.                 case TRIGGER_BLUECAPTURE:
  301.                     if ( trap_Cmd_DoesClientHaveItem ( arg1, ITEM_REDFLAG ) )
  302.                     {
  303.                         char clientname[MAX_QPATH];
  304.                         trap_Cmd_GetClientName ( arg1, clientname, MAX_QPATH );
  305.                         trap_Cmd_TextMessage ( -1, va("%s has captured the Red Flag!", clientname ) );
  306.                         trap_Cmd_ResetItem ( ITEM_REDFLAG );
  307.                         trap_Cmd_StartGlobalSound ( gametype.flagCaptureSound );
  308.                         trap_Cmd_AddTeamScore ( arg2, 1 );
  309.                         trap_Cmd_SetHUDIcon ( 0, gametype.iconRedFlag );
  310.  
  311.                         if ( !gt_simpleScoring.integer )
  312.                         {
  313.                             trap_Cmd_AddClientScore ( arg1, 10 );
  314.                         }
  315.                         gametype.redFlagDropTime = 0;
  316.                         return 1;
  317.                     }
  318.                     break;
  319.  
  320.                 case TRIGGER_REDCAPTURE:
  321.                     if ( trap_Cmd_DoesClientHaveItem ( arg1, ITEM_BLUEFLAG ) )
  322.                     {
  323.                         char clientname[MAX_QPATH];
  324.                         trap_Cmd_GetClientName ( arg1, clientname, MAX_QPATH );
  325.                         trap_Cmd_TextMessage ( -1, va("%s has captured the Blue Flag!", clientname ) );
  326.                         trap_Cmd_ResetItem ( ITEM_BLUEFLAG );
  327.                         trap_Cmd_StartGlobalSound ( gametype.flagCaptureSound );
  328.                         trap_Cmd_AddTeamScore ( arg2, 1 );
  329.                         trap_Cmd_SetHUDIcon ( 1, gametype.iconBlueFlag );
  330.  
  331.                         if ( !gt_simpleScoring.integer )
  332.                         {
  333.                             trap_Cmd_AddClientScore ( arg1, 10 );
  334.                         }
  335.  
  336.                         gametype.blueFlagDropTime = 0;
  337.                         return 1;
  338.                     }
  339.                     break;
  340.             }
  341.  
  342.             return 0;
  343.     }
  344.  
  345.     return 0;
  346. }
  347.  
  348. #ifndef GAMETYPE_HARD_LINKED
  349. // this is only here so the functions in q_shared.c and bg_*.c can link (FIXME)
  350.  
  351. void QDECL Com_Error( int level, const char *msg, ... ) 
  352. {
  353.     va_list        argptr;
  354.     char        text[1024];
  355.  
  356.     va_start (argptr, msg);
  357.     vsprintf (text, msg, argptr);
  358.     va_end (argptr);
  359.  
  360.     trap_Error( text );
  361. }
  362.  
  363. void QDECL Com_Printf( const char *msg, ... ) 
  364. {
  365.     va_list        argptr;
  366.     char        text[1024];
  367.  
  368.     va_start (argptr, msg);
  369.     vsprintf (text, msg, argptr);
  370.     va_end (argptr);
  371.  
  372.     trap_Print( text );
  373. }
  374.  
  375. #endif
  376.